package models;

import java.util.Observable;

/**
 * Clase Cronometro
 * Implementa un objeto Runnable y a su vez
 * es observable. Usa un patron Singleton
 * para tener una unica instancia de cronometro
 * Permite llevar el tiempo de la partida actual
 */
public class Cronometer extends Observable implements Runnable{
    
    Thread crono_hilo = null;
    
    private String time;
    private int segundos;
    private int minutos;
    private int horas;
    private static Cronometer instance;

    /**
     * Obtiene la instancia del cronometro
     * @return Cronometer
     */
    public synchronized static Cronometer getInstance(){
        if (instance == null)
            instance = new Cronometer();
        return instance;
    }
    
    /**
     * Constructor privado de la clase
     */
    private Cronometer() {        
        crono_hilo = new Thread(this);
    }
    
    /**
     * Implementacion del metodo run de la clase runnable
     */
    @Override
    public void run(){        
        while(true){
            try {
                Thread.sleep(1000);
                segundos ++;
                //Si los segundos llegan a 60 entonces aumenta 1 los minutos
                //y los segundos vuelven a 0
                if(segundos == 60) {
                    segundos = 0;
                    minutos++;
                }
                //Si los segundos llegan a 60 entonces aumenta 1 los minutos
                //y los segundos vuelven a 0
                if(minutos == 60) {
                    minutos = 0;
                    horas++;
                }                
                if(horas < 10) time = "0" + horas + ":";
                else time = horas + ":";
                if(minutos < 10) time += "0" + minutos + ":";
                else time += minutos  + ":";
                if(segundos < 10) time += "0" + segundos;
                else time += segundos;
                //Notificacion al observador                
                setChanged();
                notifyObservers("TIME_CHANGED");
            } catch (InterruptedException ex) {
                    System.out.println("Cronometro Error");
                    ex.printStackTrace();
            }
        }
    }
    
    /**
     * Inicia el contador de Tiempo
     */
     public  void iniciarTiempo(){
        time = "00:00:00";
        horas = 0;
        minutos = 0;
        segundos = 0;        
        if (crono_hilo.isAlive()){
            crono_hilo.resume();
        } else {
            crono_hilo.start();            
        }
    }
    
     /**
      * Para el contador de tiempo
      */
    public  void pararTiempo(){        
        crono_hilo.suspend();
    }

    /**
     * Obtiene el tiempo transcurrido
     * @return 
     */
    public  String obtenerTiempo(){
        return  time;
    }
    
    /**
     * Obtiene los minutos totales para calcular la puntuacion
     * @return cada 10 segundos 1.
     */
    public  int obtenerMinutos(){
        if (((horas * 3600)+ (minutos * 60) + segundos)%10 == 0){
            return 1;
        }
        return 0;
    }
}
